Groovy একটি ডাইনামিক প্রোগ্রামিং ভাষা যা Meta-Programming এর শক্তিশালী সমর্থন প্রদান করে। Meta-Programming এমন একটি প্রক্রিয়া যা কোডের গঠন এবং আচরণকে রানটাইম বা কম্পাইল-টাইমে পরিবর্তন করতে সহায়তা করে। Groovy তে, মেটা-প্রোগ্রামিং দুটি প্রধান ধাপে ভাগ করা যায়: Compile-Time Meta-Programming এবং Runtime Meta-Programming। এই দুটি পদ্ধতি কোডের আচরণ পরিবর্তন করতে সহায়তা করে, তবে তারা বিভিন্ন সময়ে এবং বিভিন্ন উপায়ে কাজ করে।
এখানে Compile-Time এবং Runtime Meta-Programming এর সম্পর্কে বিস্তারিত আলোচনা করা হলো।
Compile-Time Meta-Programming হল একটি পদ্ধতি যা কম্পাইলেশনের সময় কোডের মেটা-ডেটা পরিবর্তন বা প্রসেস করে। Groovy তে AST Transformations (Abstract Syntax Tree Transformations) ব্যবহার করে Compile-Time মেটা-প্রোগ্রামিং করা হয়। এই প্রক্রিয়ায়, কোডের গঠন (syntax) বা তার আচরণ কম্পাইলেশন টাইমে পরিবর্তন করা হয়, এবং এটি কোডের কার্যকারিতা সরাসরি প্রভাবিত করতে পারে।
Groovy তে AST Transformations ব্যবহার করে আপনি ক্লাসের মেথড বা প্রপার্টির আচরণ পরিবর্তন করতে পারেন, যেমন @TupleConstructor, @Canonical, @Immutable, ইত্যাদি। এগুলি কম্পাইল-টাইমে কোডকে পরিবর্তন করে।
@TupleConstructor
একটি Groovy AST transformation যা ক্লাসের জন্য একটি কন্সট্রাক্টর তৈরি করে, যা সব প্রপার্টি প্যারামিটার হিসেবে নেবে।
@TupleConstructor
class Person {
String name
int age
}
def person = new Person("John", 30)
println person.name // Output: John
println person.age // Output: 30
এখানে, @TupleConstructor
দিয়ে Groovy ক্লাসের জন্য একটি কন্সট্রাক্টর তৈরি করেছে, যা name
এবং age
কে ইনিশিয়ালাইজ করে।
@Canonical
একটি Groovy AST transformation যা ক্লাসের জন্য toString()
, equals()
এবং hashCode()
মেথডগুলি তৈরি করে।
@Canonical
class Person {
String name
int age
}
def person1 = new Person("Alice", 25)
def person2 = new Person("Alice", 25)
println person1 // Output: Person(Alice, 25)
println person1 == person2 // Output: true
এখানে, @Canonical
মেটা-প্রোগ্রামিং ট্যাগ ক্লাসের জন্য toString()
, equals()
, এবং hashCode()
মেথড তৈরি করেছে।
Groovy তে Compile-Time Mixin ব্যবহার করে আপনি ক্লাসে নতুন বৈশিষ্ট্য বা আচরণ যোগ করতে পারেন। এটি সাধারণত কোডের আগে কার্যকর হয়।
class Person {
String name
int age
}
@Mixin(Person)
class SpecialPerson {
String nickname
}
def person = new SpecialPerson(name: "John", age: 30, nickname: "Johnny")
println person.nickname // Output: Johnny
এখানে, @Mixin
কম্পাইল-টাইমে SpecialPerson
ক্লাসে Person
ক্লাসের বৈশিষ্ট্য যোগ করেছে।
Runtime Meta-Programming হল এমন একটি প্রক্রিয়া যেখানে কোডের গঠন বা আচরণ রানটাইমে পরিবর্তিত হয়। Groovy তে আপনি MetaClass, ExpandoMetaClass এবং Method Missing এর মতো বিভিন্ন মেকানিজম ব্যবহার করে রানটাইম মেটা-প্রোগ্রামিং করতে পারেন। রানটাইম মেটা-প্রোগ্রামিং এর মাধ্যমে, আপনি অবজেক্টের মেথড, প্রপার্টি বা আচরণ পরিবর্তন করতে পারেন, এমনকি এটি তৈরি হওয়ার পরেও।
Groovy তে MetaClass ব্যবহার করে আপনি একটি ক্লাসের মেথড বা প্রপার্টি রানটাইমে পরিবর্তন করতে পারেন। Groovy এর ExpandoMetaClass এর মাধ্যমে, আপনি ডাইনামিকভাবে মেথড যোগ করতে পারেন।
class Person {
String name
int age
}
def person = new Person(name: "Alice", age: 25)
println person.name // Output: Alice
// Modify the name property using MetaClass
person.metaClass.getName = { -> "Modified: ${delegate.name}" }
println person.name // Output: Modified: Alice
এখানে, metaClass
ব্যবহার করে Person
ক্লাসের name
প্রপার্টি রানটাইমে পরিবর্তন করা হয়েছে।
class Person {
String name
int age
}
def person = new Person(name: "Bob", age: 28)
// Dynamically add a new method at runtime
person.metaClass.sayHello = { -> println "Hello, I am ${delegate.name}!" }
person.sayHello() // Output: Hello, I am Bob!
এখানে, ExpandoMetaClass
ব্যবহার করে sayHello
মেথড রানটাইমে Person
ক্লাসে যোগ করা হয়েছে।
Groovy তে Method Missing একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একটি মেথডের জন্য ডাইনামিকভাবে কোড লিখতে সক্ষম করে, যখন সেই মেথড কোনও ক্লাসে ডিফাইন করা না থাকে।
class DynamicPerson {
def methodMissing(String name, args) {
println "Method $name is called with arguments $args"
}
}
def person = new DynamicPerson()
person.someMethod("Hello", "World") // Output: Method someMethod is called with arguments [Hello, World]
এখানে, methodMissing
ব্যবহার করা হয়েছে ডাইনামিকভাবে মেথড কল হ্যান্ডল করার জন্য, যেখানে someMethod
ডিফাইন করা হয়নি।
বৈশিষ্ট্য | Compile-Time Meta-Programming | Runtime Meta-Programming |
---|---|---|
কাজের সময় | কম্পাইলেশনের সময় | রানটাইমে |
কোড পরিবর্তন | কোডের গঠন কম্পাইলেশনের সময় পরিবর্তন হয় | কোডের আচরণ রানটাইমে পরিবর্তিত হয় |
বৈশিষ্ট্য/অভ্যাস | AST Transformations, Compile-Time Mixin | MetaClass, ExpandoMetaClass, Method Missing |
উদাহরণ | @TupleConstructor , @Canonical , @Immutable | metaClass , ExpandoMetaClass , methodMissing |
প্রয়োগ | ক্লাসের কোড পরিবর্তন করা | অবজেক্টের আচরণ বা ফাংশনালিটি রানটাইমে পরিবর্তন করা |
Groovy তে Meta-Programming একটি শক্তিশালী ফিচার যা কোডের গঠন এবং আচরণকে পরিবর্তন করতে সহায়তা করে। Compile-Time Meta-Programming কোডের গঠন কম্পাইলেশনের সময় পরিবর্তন করে (যেমন AST Transformations), এবং Runtime Meta-Programming কোডের আচরণ রানটাইমে পরিবর্তিত হয় (যেমন metaClass
, ExpandoMetaClass
, এবং methodMissing
)। Groovy তে মেটা-প্রোগ্রামিংয়ের মাধ্যমে আপনি কোডের কার্যকারিতা পরিবর্তন, নতুন মেথড বা প্রপার্টি ডাইনামিকভাবে যোগ করতে পারেন, যা উন্নত ও নমনীয় প্রোগ্রামিংয়ের জন্য উপকারী।
common.read_more